package cn.dj.org.controller;

import cn.dj.basic.annotation.PreAuthorize;
import cn.dj.basic.util.AjaxResult;
import cn.dj.basic.util.PageList;
import cn.dj.org.domain.Department;
import cn.dj.org.domain.Employee;
import cn.dj.org.query.EmployeeQuery;
import cn.dj.org.service.DepartmentService;
import cn.dj.org.service.EmployeeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 接口类：员工的
 */
//swagger常用的注解：用于打在Controller对Controller做描述 - 这样页面上就会显示description的值 - 不会显示英文
@Api(value = "员工接口类",description = "处理员工的CRUD操作的")

//@ResponseBody //返回json格式字符串
//@Controller //创建对象
    //前端分离项目都是同时异步请求 - 异步请求都需要加上@ResponseBody - 故用整合注解@RestController
@RestController//=@Controller+@ResponseBody（就不用每一个方法上写了）
@RequestMapping(value = "/employee")//匹配路径
public class EmployeeController {
    //注入
    @Autowired
    private EmployeeService employeeService;
    @Autowired //注入
    private DepartmentService departmentService;

    /**
     * 接口：查找单个对象
     * @param id
     * @return
     */
    //前端：get http://localhost:8080/employee/1 - 请求地址 - 写了注解@GetMapping才把1变成了请求参数
        //匹配请求 请求方式get
    @GetMapping(value = "/{id}")//请求参数用{}起来 - 地址路径上的参数传过来，应该用变量id去接收
    @ApiOperation(value = "接口：查询单个对象")//swagger常用的注解：在方法上，对方法做描述-这样页面上就会显示value的值
    @PreAuthorize(name = "查询单个员工",sn = "employee:getOne")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public Employee findOne(@PathVariable("id")Long id){//(@PathVariable("id") - 变量名为id的值赋给Long id
        return  employeeService.loadById(id);
    }

    /**
     * 接口：查询所有
     * @return
     */
    //前端：get http://localhost：8080/employee
     //区分不同请求：请求方式和请求地址
    @GetMapping//匹配请求 请求方式get
    @ApiOperation(value = "接口：查询所有")//swagger常用的注解：在方法上，对方法做描述-这样页面上就会显示value的值
    @PreAuthorize(name = "员工查询所有",sn = "employee:getAll")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public List<Employee> findAll(){
        return employeeService.loadAll();
    }

    /**
     * 接口：删除
     */
//    前端：delete http://localhost：8080/employee/1
    @DeleteMapping("/{id}")//匹配请求 请求方式delete
    @ApiOperation(value = "接口：删除")//swagger常用的注解：在方法上，对方法做描述-这样页面上就会显示value的值
    @PreAuthorize(name = "员工删除",sn = "employee:delete")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public AjaxResult delete(@PathVariable("id")Long id){
        try {
            employeeService.del(id);
            return  new AjaxResult();//默认 - 操作成功
        } catch (Exception e) {
            e.printStackTrace();//打印错误信息
            return  new AjaxResult(false,"删除失败");//调用有参构造
        }
    }

    /**
     * 接口：批量删除
     */
//    前端：delete http://localhost：8080/employee/1
    @PatchMapping //请求方式patch  匹配请求
    @ApiOperation(value = "接口：批量删除")//swagger常用的注解：在方法上，对方法做描述-这样页面上就会显示value的值
    @PreAuthorize(name = "员工批量删除",sn = "employee:patchDel")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public AjaxResult patchDelete(@RequestBody List<Long> ids){ //或Long[] ids
        try {
            //1.调用service批量删除
            employeeService.patchDelete(ids);
            return  new AjaxResult();//默认 - 操作成功
        } catch (Exception e) {
            e.printStackTrace();//打印错误信息
            return  new AjaxResult(false,"删除失败");//调用有参构造
        }
    }

    /**
     * 接口：添加或修改
     */
    // 前端：put http://localhost：8080/employee/ json对象{}
    @PutMapping //请求方式put //匹配请求
    @ApiOperation(value = "接口：添加或修改")//swagger常用的注解：在方法上，对方法做描述-这样页面上就会显示value的值
    //现在ResultFul风格必须用注解@RequestBody才拿得到数据
    @PreAuthorize(name = "员工保存",sn = "employee:save")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public AjaxResult addOrUpdate(@RequestBody Employee employee){
        try {
            if(employee.getId()==null){//添加 - 不传id-自增长
                employeeService.save(employee);
            }else {//修改
                employeeService.update(employee);
            }
            return  new AjaxResult();
        } catch (Exception e) {
            e.printStackTrace();
//            return  new AjaxResult(false,"操作失败");
                //两种方式都可以，这是链式语法:调用一个方法，然后返回的就是它本身的对象
            return  AjaxResult.me().setSuccess(false).setMsg("操作失败");
        }
    }

    /**
     * 接口：分页 和 高级查询
     */
// 前端：post http://localhost：8080/employee  json对象{}
    //匹配请求
    @PostMapping //用post请求原因：会与添加或修改、查询单个的冲突【请求地址http://localhost：8080/employee+请求方式 其中一个一样，都不行】，所以用post
        //@RequestBody从请求体中拿参数，不能用Get，所以地址上也不会传对象 - 会与查找所有的地址产生冲突【若用get，请求方式也会冲突】
    @ApiOperation(value = "接口：分页和高级查询")//swagger常用的注解：在方法上，对方法做描述
    @PreAuthorize(name = "员工的分页查询",sn = "employee:list")//会解析的时候自动根据sn去查数据库表，有数据查到了就修改，没有在数据库表中查到就是添加
    public PageList<Employee> queryPage(@RequestBody EmployeeQuery employeeQuery){
        return employeeService.queryPage(employeeQuery);
    }

    /**
     * 员工中的添加修改模态框中需要显示部门树
     * 接口：查询部门树
     * @return
     */
    @ApiOperation(value = "接口：查询部门树")//swagger常用的注解：在方法上，对方法做描述
    @GetMapping("/deptTree")//匹配请求 请求方式get
    public List<Department> deptTree(){
        return departmentService.deptTree();
    }

    /**
     * 查询指定店铺的所有管理人员
     * @param shopId
     * @return
     */
    @GetMapping("/list/{shopId}")
    public List<Employee> queryByShopId(@PathVariable("shopId") Long shopId){
        return employeeService.queryByShopId(shopId);
    }

}
